/**
 * @author chj
 * 创建时间：2020年8月29日
 * 修改时间：2020年8月29日
 * --------------------
 * 设计模式：工厂方法模式
 * 基本定义：将模板方法模式用于生成实例的设计模式是工厂方法模式（Factory Method Pattern）。
 * 详细说明：
 * * Factory Method模式中的“Factory”有"工厂"的意思。
 * * 用Template Method模式来构建生成实例的工厂，这就是Factory Method模式。
 * * 在Factory Method模式中，父类定义实例的生成流程，子类定义实例的生成。
 * * 这样就可以将生成实例的框架（framework）和生成实例的加工（process）解耦。
 * 示例说明：
 * * 该示例是一段制作身份证（ID卡）的简单程序。
 * * 含有的类：Product、Factory、IDCard、IDCardFactory、Main。
 * * - Product类、Factory类组成了生成实例的框架（Framework）。
 * * - IDCard类、IDCardFactory类组成了含有生成实例的加工（process）的应用（Application）。
 * * - Main类是用于测试程序行为的类。
 * * 登场角色：TemplateProduct、TemplateFactory、ConcreteProduct、ConcreteFactory
 * * - TemplateProduct、TemplateFactory的关系和ConcreteProduct、ConcreteFactory的关系是平行的。
 * * - TemplateProduct角色决定了Factory Method模式中生成的实例所持有的接口（API）。
 * * - TemplateFactory角色决定了actory Method模式中实例的生成流程。
 * * - ConcreteProduct角色决定了Factory Method模式中生成的实例。
 * * - ConcreteFactory角色决定了Factory Method模式中实例的生成。
 * 优点：不用new关键字来生成实例，而是调用生成实例的专用方法来生成实例，这样就可以防止模板类与具体类耦合。
 * 缺点：必须要理解父类中所定义的生成流程和其中所使用的抽象方法，然后阅读这些抽象方法在子类中的实现才能完整了解各类的行为。
 * --------------------
 * 注：通常，使用设计模式设计类时，必须要向维护这些类的开发人员正确地传达使用这些设计模式的意图。否则，维护这些类的开发人员在修改设计时可能会违背设计者最初使用这些设计模式的意图。
 * 注：建议在程序注释和开发文档中记录所使用的设计模式的名称和意图。
 * 注：开放对外公开的包时，推荐将域名反着写，形成世界上独一无二的包名。
 */
package factory_method;